//***定义为全局变量***
//获取驱动信息
var driver = JSON.parse($("#dirverJson").text());

// 定义JSON格式化函数
var formatJson = function(json, options) {
	var reg = null, formatted = '', pad = 0, PADDING = '    ';
	// optional settings
	options = options || {};
	// remove newline where '{' or '[' follows ':'
	options.newlineAfterColonIfBeforeBraceOrBracket = (options.newlineAfterColonIfBeforeBraceOrBracket === true) ? true
			: false;
	// use a space after a colon
	options.spaceAfterColon = (options.spaceAfterColon === false) ? false
			: true;

	// begin formatting...
	// make sure we start with the JSON as a string
	if (typeof json !== 'string') {
		json = JSON.stringify(json);
	}
	// parse and stringify in order to remove extra whitespace
	json = JSON.parse(json);
	json = JSON.stringify(json);

	// add newline before and after curly braces
	reg = /([\{\}])/g;
	json = json.replace(reg, '\r\n$1\r\n');

	// add newline before and after square brackets
	reg = /([\[\]])/g;
	json = json.replace(reg, '\r\n$1\r\n');

	// add newline after comma
	reg = /(\,)/g;
	json = json.replace(reg, '$1\r\n');

	// remove multiple newlines
	reg = /(\r\n\r\n)/g;
	json = json.replace(reg, '\r\n');

	// remove newlines before commas
	reg = /\r\n\,/g;
	json = json.replace(reg, ',');

	// optional formatting...
	if (!options.newlineAfterColonIfBeforeBraceOrBracket) {
		reg = /\:\r\n\{/g;
		json = json.replace(reg, ':{');
		reg = /\:\r\n\[/g;
		json = json.replace(reg, ':[');
	}
	if (options.spaceAfterColon) {
		reg = /\:/g;
		json = json.replace(reg, ': ');
	}

	$.each(json.split('\r\n'), function(index, node) {
		var i = 0, indent = 0, padding = '';

		if (node.match(/\{$/) || node.match(/\[$/)) {
			indent = 1;
		} else if (node.match(/\}/) || node.match(/\]/)) {
			if (pad !== 0) {
				pad -= 1;
			}
		} else {
			indent = 0;
		}

		for (i = 0; i < pad; i++) {
			padding += PADDING;
		}
		formatted += padding + node + '\r\n';
		pad += indent;
	});
	return formatted;
};

// 定义新增日志模板格式
var buildEvent = function(event) {
	// 定义模板
	var e = {
		"eventType" : event,
		"before" : [],
		"after" : []
	};
	// 生成同步字段
	var syncFileds = driver.sourceMapping.fileds;
	var len = syncFileds.length;
	var fileds = [];
	for (var i = 0; i < len; i++) {
		var f = syncFileds[i];
		fileds.push({
			"name":f.name,
			"value":null
		});
	}
	// 判断必备的字段
	switch (event) {
	case "INSERT":
		e.after = fileds;
		break;
	case "UPDATE":
		e.before = fileds;
		e.after = fileds;
		break;
	case "DELETE":
		e.before = fileds;
		break;
	default:
		break;
	}
	return JSON.stringify(e);;
}

// 格式化日志
function formatLog(logs) {
	var len = logs.length;
	$("#logCount").html(len);
	// 生成面板
	var $tem = $("#logPanelTemplate");
	var logsHtml = "";
	for (var i = 0; i < len; i++) {
		var log = JSON.parse(logs[i]);
		var $log_id = $tem.find('.log-id');
		var $log_index = $tem.find('.log-index');
		var $log_title = $tem.find('.log-title');
		var $log_panel_id = $tem.find('.log-panel-id');
		var $log_date = $tem.find('.log-date');
		var $log_params = $tem.find('.log-params');
		// 回填
		$log_id.val(log.id);
		$log_index.html((i+1));
		$log_title.html(log.message);
		var logPanelId = "log-error-"+(i+1);
		$log_title.attr("href", "#"+logPanelId);
		$log_panel_id.attr("id", logPanelId);
		$log_date.html(log.date);
		$log_params.html(JSON.stringify(log.params));
		logsHtml += $tem.html();
	}
	// 获取日志面板区域
	var $logPanelArea = $("#logPanelArea");
	$logPanelArea.html(logsHtml);
	
	// 显示增量同步模式的隐藏按钮功能
	if(driver.model=='increment'){
		$(".incBtn").removeClass("hidden");
	}
	// 注册面板展开收缩事件
	$('.logPanel').collapse({
		toggle : false
	});
	bindClickForFormartBtn();
	// 绑定复选框事件
	bindClickForCheckBoxs($logPanelArea);
	// 绑定全部同步事件
	bindClickForSyncAllBtn();
	// 绑定同步事件
	bindClickForSyncBtn();
	// 绑定删除事件
	bindClickForDelBtn();
}

// 格式化JSON
function formatStrToJson($textarea){
	var v = $textarea.val();
	if(''==v){
		bootGrowl("参数不能为空", "danger");
		return;
	}
	// 如果没有美化
	var b = $textarea.attr("before");
	if (!b) {
		// 临时保存美化前的值
		$textarea.attr("before", v);
		$textarea.val(formatJson(v));
		return;
	}
	// 还原美化前的值
	$textarea.val(b);
	$textarea.removeAttr("before");
}

// 查询驱动日志
function showDriverLog(driver) {
	$.loadingT(true);
	$.post($basePath + "/index/getDriverLog", {
		"driverId" : driver.id
	}, function(data) {
		$.loadingT(false);
		if (data.success == true) {
			formatLog(data.resultValue);
		} else {
			bootGrowl(data.resultValue, "danger");
		}
	});
}

// 打开确认对话框函数(标题, 消息, 确认回调函数, 参数, 加载完成函数)
function openConfirmDialog(title, message, fn, params, onshown) {
	// 如果当前为恢复状态
	BootstrapDialog.show({
		title : title,
		type : BootstrapDialog.TYPE_INFO,
		message : message,
		size : BootstrapDialog.SIZE_NORMAL,
		onshown: onshown,
		buttons : [ {
			label : "确定",
			action : function(dialog) {
				var info = dialog.getModalContent();
				if($(info).formValidate()==false){
					return false;
				}
				dialog.close();
				if (undefined != fn) { fn(dialog, params) }
			}
		}, {
			label : "取消",
			action : function(dialog) {
				dialog.close();
			}
		} ]
	});
}

// 获取选中复选框
function findCheckedBoxs(putVal) {
	var ckArr = [];
	var $ckBoxs = $("#logPanelArea").find("[type='checkbox']");
	$ckBoxs.each(function(i, e) {
		var $this = $(this);
		// <div class="panel panel-warning">
		var $panel = $this.parent().parent().parent();
		var isCked = $panel.find('.checked').is('.checked');
		if (isCked) {
			var r = {"i":i,"id":$this.val()};
			if ('undefined' != typeof putVal) {
				var v = $panel.find(".log-params").val();
				r.params = JSON.parse(v);
			}
			ckArr.push(r);
		}
	});
	if (ckArr.length < 1) {
		bootGrowl("至少选择一行日志.", "danger");
	}
	return ckArr;
}

// 发送Ajax请求
function send(url, data){
	$.loadingT(true);
	$.post($basePath + url, {"msg" : JSON.stringify(data)}, function(data) {
		$.loadingT(false);
		if (data.success == true) {
			bootGrowl(data.resultValue, "success");
			// 加载页面
			showDriverLog(driver);
		} else {
			bootGrowl(data.resultValue, "danger");
		}
	});
}

// 绑定日志参数格式化事件
function bindClickForFormartBtn() {
	// 绑定格式化事件
	$(".formartJson").unbind('click').click(function() {
		var $textarea = $(this).parent().parent().parent().find("textarea");
		formatStrToJson($textarea);
	});
}

// 绑定复选框勾选事件
function bindClickForCheckBoxs($logPanelArea) {
	var config = {
		checkboxClass : 'icheckbox_flat-red',
		radioClass : 'iradio_minimal-red',
		increaseArea : '20%', // optional
		labelHover : true
	};
	// 绑定全选复选框事件
	$("#ckBoxAll").iCheck(config).iCheck('uncheck').on('ifChecked', function(e) {
		$logPanelArea.find("[type='checkbox']").iCheck('check');
	}).on('ifUnchecked', function(e) {
		$logPanelArea.find("[type='checkbox']").iCheck('uncheck');
	});
	// 初始化所有复选框事件
	$logPanelArea.find("[type='checkbox']").iCheck(config);
}

// 绑定同步所有事件
function bindClickForSyncAllBtn() {
	$("#syncAll").unbind('click').bind('click', function() {
		var fn = function() {
			$.loadingT(true);
			$.post($basePath + "/index/syncLogAll", {
				"driverId" : driver.id
			}, function(data) {
				$.loadingT(false);
				if (data.success == true) {
					bootGrowl(data.resultValue, "success");
					// 加载页面
					showDriverLog(driver);
				} else {
					bootGrowl(data.resultValue, "danger");
				}
			});
		}
		openConfirmDialog("提示", "确认全部同步?", fn);
	});
}

// 绑定同步事件
function bindClickForSyncBtn() {
	$("#sync").unbind('click').bind('click', function() {
		var params = findCheckedBoxs(true); // 获取选中复选框
		var len = params.length;
		if (len > 0) {
			var fn = function(dialog, params) {
				var data = {"id" : driver.id, "rows" : params};
				send("/index/syncLog", data);
			}
			openConfirmDialog("提示", "确认同步 " + len + " 条数据?", fn, params);
		}
	});
}

// 绑定删除事件
function bindClickForDelBtn() {
	$("#del").unbind('click').bind('click', function() {
		var params = findCheckedBoxs(); // 获取选中复选框
		var len = params.length;
		if (len > 0) {
			var fn = function(dialog, params) {
				var data = {"id" : driver.id, "del" : params};
				send("/index/delLog", data);
			}
			openConfirmDialog("提示", "确认彻底删除 " + len + " 条数据?", fn, params);
		}
	});
}

// 绑定新增事件
function bindClickForAddBtn() {
	$("#add").bind('click', function() {
		// 初始化函数
		var initDialog = function(dialog) {
			// 获取表单输入值
			var info = dialog.getModalContent();
			var $select = $(info).find(".select-control");
			$select.select2({
				width : "100%",
				theme : "classic",
				// Infinity展示的Option个数不限制
				minimumResultsForSearch : Infinity
			});
			var $params = $(info).find("textarea");
			$params.val(buildEvent("INSERT"));
			$select.change(function(){
				$params.removeAttr("before");
				$params.val(buildEvent($(this).val()));
			});
			
			// 绑定格式化事件
			$(info).find(".formartJson").click(function() {
				formatStrToJson($(this).parent().find("textarea"));
			});
		}
		// 确认
		var fn = function(dialog) {
			var info = dialog.getModalContent();
			var reason = [{
				"message":"手动日志",
				"params":JSON.parse($(info).find(".log-params").val())
			}];
			var data = {"id" : driver.id, "reason" : reason};
			send("/index/addLog", data);
		}
		var dirverLoginHtml = $("#addLogDialog").html();
		openConfirmDialog("新增日志", dirverLoginHtml, fn, '', initDialog);
	});
}

// 绑定下载日志事件
function bindClickForDownloadBtn() {
	$("#download").click(function() {
		window.location.href = $basePath + '/index/download?dirverId=' + driver.id;
	});
}

// 绑定刷新事件
function bindClickForRefreshBtn() {
	$("#refresh").click(function() {
		showDriverLog(driver);
	});
}

// 绑定返回事件
function bindClickForReturnBtn() {
	// 返回
	$("#driverBackIndexBtn").click(function() {
		$initContainer.load($basePath + "/index");
	});
}

$(function() {
	// 绑定返回事件
	bindClickForReturnBtn();
	// 显示驱动编辑信息
	showDriverLog(driver);
	// 绑定新增事件
	bindClickForAddBtn();
	// 绑定下载日志按钮事件
	bindClickForDownloadBtn();
	// 绑定刷新事件
	bindClickForRefreshBtn();
})